package top.wfzzq.ds;

/**
 * 递归
 * 
 * @author wanghui
 *
 */
public class Recursion {
	/**
	 * 计算num的阶乘就是（5的阶乘就是5*4*3*2*1）
	 * 
	 * @param num
	 *            区间为[1-100]
	 * @return
	 */
	public static long factorial(int num) {
		int max = 20;
		int min = 1;
		if (num < 1 || num > 20) {
			throw new RuntimeException("num超出范围");
		}
		long result = 1;

		for (long i = 1; i <= num; i++) {
			result = result * i;
		}
		return result;
	}

	/**
	 * 递归版本的阶乘，递归就是方法调用自身<br/>
	 * 递归是方法调用自身递归的两个要素，第一要有自己调用自己，第二是要有停止条件 递归最适合解决大的问题可以切分和自己一样的小问题
	 * 
	 * @param num
	 * @return
	 */
	public static long rfactorial(int num) {
		// 要素：递归停止条件，1的阶乘就是1
		if (num == 1) {
			return 1;
		}
		// 要素，调用自己
		return num * rfactorial(num - 1);
	}

	public static int jiaogu(int num) {
		if (num == 1) {
			return 1;
		}
		int count = 1;
		if (num % 2 == 0) {
			num = num / 2;
		}
		if (num % 2 == 1) {
			num = num * 3 + 1;
		}

		for (int i = 0; i <= num; i++) {
            count=count+1;
		}
		return num;
	}
}
